package com.itheima.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.common.BaseContext;
import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    登录权限验证关键点：
		1.判断当前请求的资源是否需要登录	【根据请求地址判断】
		2.判断用户是否已经登录				【根据session中存储的employee是否为null】

	实现步骤：
		1.创建过滤器LoginCheckFilter 设置过滤请求路径为/*
		2.在启动类上打上注解@ServletComponentScan
		3.在doFilter方法中编写登录过滤处理代码
			3.0:强转两个对象
			3.1：获取当前请求地址uri
			3.2：声明无需登录的请求资源
			3.3：判断当前请求的资源是否需要登录
			3.4：不需要 直接放行 代码不再继续向下执行了
			3.5：需要登录 判断用户是否已经登录
			3.6：已经登录 直接放行 代码不再继续向下执行了
			3.7：没有登录 跳转到登录页面
					R对象 ==> {"code":0,"msg":"NOTLOGIN"}
 */
@Slf4j
@WebFilter("/*")
public class LoginCheckFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

        log.info("LoginCheckFilter...："+Thread.currentThread().getId());

        //3.0:强转两个对象
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //3.1：获取当前请求地址uri
        String uri = request.getRequestURI();
        //System.out.println("uri = " + uri);

        //3.2：声明无需登录的请求资源  【静态资源和登录退出请求无需要求登录】
        String[] urls = {"/backend/**","/front/**","/employee/login","/employee/logout","/user/sendMsg","/user/login"};

        //3.3：判断当前请求的资源是否需要登录
        //传统方式：
        /*for (String url : urls) {
            if(uri.contains(url)){
                //3.4：不需要 直接放行 代码不再继续向下执行了
                chain.doFilter(request,response);
                //break;  //跳出循环 代码会继续向下执行
                return;   //1.返回数据  2.跳出方法执行
            }
        }*/

        //今后 实际路径匹配判断 会用AntPathMatcher【路径匹配器 支持通配符表示】
        AntPathMatcher matcher = new AntPathMatcher();
        for (String url : urls) {
            if(matcher.match(url,uri)){
                //3.4：不需要 直接放行 代码不再继续向下执行了
                chain.doFilter(request,response);
                return;
            }
        }

        //3.5：后台管理系统：需要登录 判断员工是否已经登录
        //获取session中存储的员工id  判断是否为null  为null：未登录  不为null：已经登录
        Object employee = request.getSession().getAttribute("employee");

        //3.6：已经登录 直接放行 代码不再继续向下执行了
        if(employee!=null){
            BaseContext.setCurrentId((Long) employee);
            chain.doFilter(request,response);
            return;
        }

        //3.5：前台用户系统：需要登录 判断用户是否已经登录
        Object user = request.getSession().getAttribute("user");
        if(user!=null){
            BaseContext.setCurrentId((Long) user);
            chain.doFilter(request,response);
            return;
        }

        //3.7：没有登录 跳转到登录页面 R对象 ==> {"code":0,"msg":"NOTLOGIN"}
        response.getWriter().print(JSON.toJSONString(R.error("NOTLOGIN")));
    }

    @Override
    public void destroy() {

    }
}
